/*
 * SlipMinusLineChart.java
 * Android-Charts
 *
 * Created by limc on 2014.
 *
 * Copyright 2011 limc.cn All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package cn.limc.androidcharts.view;

import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.util.Log;

import cn.limc.androidcharts.entity.DateValueEntity;
import cn.limc.androidcharts.entity.LineEntity;

/**
 * <p>
 * en
 * </p>
 * <p>
 * jp
 * </p>
 * <p>
 * cn
 * </p>
 *
 * @author limc
 * @version v1.0 2014/01/21 14:20:35
 */
public class SlipMinusLineChart extends SlipLineChart {
    private static String TAG = SlipMinusLineChart.class.getName();

    /*
     * (non-Javadoc)
     *
     * @param context
     *
     * @see cn.limc.androidcharts.view.GridChart#GridChart(Context)
     */
    public SlipMinusLineChart(Context context) {
        super(context);
    }

    /*
     * (non-Javadoc)
     *
     * @param context
     *
     * @param attrs
     *
     * @param defStyle
     *
     * @see cn.limc.androidcharts.view.GridChart#GridChart(Context,
     * AttributeSet, int)
     */
    public SlipMinusLineChart(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /*
     * (non-Javadoc)
     *
     * @param context
     *
     * @param attrs
     *
     *
     *
     * @see cn.limc.androidcharts.view.GridChart#GridChart(Context,
     * AttributeSet)
     */
    public SlipMinusLineChart(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void calcDataValueRange() {

        double maxValue = -Double.MAX_VALUE;
        double minValue = Double.MAX_VALUE;


        for (int i = 0; i < this.linesData.size(); i++) {
            LineEntity<DateValueEntity> line = this.linesData.get(i);
            if (line != null && line.getLineData().size() > 0) {
                for (int j = displayFrom; j < displayFrom + displayNumber; j++) {
                    DateValueEntity lineData = line.getLineData().get(j);
                    if (lineData.getValue() < minValue) {
                        minValue = lineData.getValue();
                    }

                    if (lineData.getValue() > maxValue) {
                        maxValue = lineData.getValue();
                    }

                }
            }
        }

        this.maxValue = maxValue;
        this.minValue = minValue;
    }

    @Override
    protected void calcValueRangePaddingZero(){

    }

    @Override
    protected void calcValueRangeFormatForAxis() {

    }
    /*
     * (non-Javadoc)
     *
     * <p>Called when is going to draw this chart<p> <p>チャートを書く前、メソッドを呼ぶ<p>
     * <p>绘制图表时调用<p>
     *
     * @param canvas
     *
     * @see android.view.View#onDraw(android.graphics.Canvas)
     */
    @Override
    protected void onDraw(Canvas canvas) {
        initAxisY();
        initAxisX();

        super.onDraw(canvas);

        // draw lines
        if (null != this.linesData) {
            drawLines(canvas);
        }
    }

    protected void drawLines(Canvas canvas) {
        if (null == this.linesData) {
            return;
        }
        // distance between two points
        float lineLength;
        // start point‘s X
        float startX;

        // draw lines
        for (int i = 0; i < linesData.size(); i++) {
            LineEntity<DateValueEntity> line = (LineEntity<DateValueEntity>) linesData
                    .get(i);
            if (line == null) {
                continue;
            }
            if (line.isDisplay() == false) {
                continue;
            }
            List<DateValueEntity> lineData = line.getLineData();
            if (lineData == null) {
                continue;
            }
            Paint mPaint = new Paint();
            mPaint.setColor(line.getLineColor());
            mPaint.setAntiAlias(true);
            // set start point’s X
            if (lineAlignType == ALIGN_TYPE_CENTER) {
                lineLength = (dataQuadrant.getQuadrantPaddingWidth() / displayNumber);
                startX = dataQuadrant.getQuadrantPaddingStartX() + lineLength / 2;
            } else {
                lineLength = (dataQuadrant.getQuadrantPaddingWidth() / (displayNumber - 1));
                startX = dataQuadrant.getQuadrantPaddingStartX();
            }

            // start point
            PointF ptFirst = null;
            for (int j = displayFrom; j < displayFrom + displayNumber; j++) {
                float value = lineData.get(j).getValue();
                // calculate Y
                float valueY = (float) ((1f - (value - minValue)
                        / (maxValue - minValue)) * dataQuadrant.getQuadrantPaddingHeight())
                        + dataQuadrant.getQuadrantPaddingStartY();

                // if is not last point connect to previous point
                if (j > displayFrom) {
                    canvas.drawLine(ptFirst.x, ptFirst.y, startX, valueY,
                            mPaint);
                }
                // reset
                ptFirst = new PointF(startX, valueY);
                startX = startX + lineLength;
            }
        }
    }
}
